前言

傳統的 float 雖然也可以解決多種排版,但對於現在更加多元的排版方式已經顯得不夠,而 flex 是 CSS3 新的佈局模式,更適合響應式的設計,也更能彈性的完成多種排版,在 Bootstrap 3 轉 Bootstrap 4 時,也捨棄了浮動,改成用 flex 來佈局。

cover

圖片來源

 


 

由於 flexible box 使用不同的排版演算法,所以下面屬性不太適合用在彈性容器內:

  • multiple column 模組的 col-* 屬性對彈性項目無效。
  • clear。
  • float。
  • vertical-align 對已對齊的彈性項目無效。

flex 中分為 外容器內元件 ,分別都有各自的屬性。

flex 外容器屬性:

  • display
  • flex-flow ( flex-direction & flex-wrap )
  • justify-content
  • align-items

flex 內元件屬性:

  • flex ( flex-grow & flex-shrink & flex-basis )
  • order
  • align-self

 


 

相關網站,能讓你更快速學會 flex 屬性:

  1. Flexbox Playground
  2. Flexy Boxes
  3. Flexbox Properties Demonstration
  4. Flexbox Froggy

 


 

外容器

display

一開始要宣告為 flex 才能使用,除了 flex 外,還有一個 inline-flex ,作用類似於 inline-block + flex ,意義上都是一個 display:flex 的元素外面包覆 display:inline 的屬性,在後方的元素不會換行。

如果需要支援較舊的瀏覽器需要加上前綴並寫在 display 屬性( property ),而不是屬性值( attribute ):
IE 支持替代的 display: -ms-flexbox 規則, Opera 、 Safari 和 Chrome 支持替代的 display: -webkit-box 規則。

.example {
    display: -webkit-box;
    display: -ms-flexbox;
    display: flex;
}

 


 

flex-flow ( flex-direction & flex-wrap )

.flex-container {
  flex-flow: <'flex-direction'> || <'flex-wrap'>
}

flex-direction

改變下圖中的軸線方向,可以將軸線做水平反轉、轉為垂直、垂直反轉等。

描述
row 默認值。作為一行,水平顯示。
row-reverse 等同 row ,但方向相反。
column 作為列,垂直顯示。
column-reverse 等同 column ,但方向相反。

flex-wrap

超出範圍時是否換行的屬性,分為換行( wrap )、不換行( nowrap )、換行時反轉( wrap-reverse )。

描述
nowrap 默認值。規定彈性項目不會換行。
wrap 規定彈性項目會在需要時換行。
wrap-reverse 規定彈性項目會在需要時反方向換行。

 


 

justify-content

接近水平對齊的設定,但嚴格說來是稱為主軸對齊,主軸的設定是上方的 flex-direction ,所以實際是水平或垂直,要依主軸的方向而定。

描述
flex-start 默認值。項目位於容器的開頭。
flex-end 項目位於容器的末端。
center 項目位於容器的中央。
space-between 首個項目放置於開頭,末尾項目放置於末端,剩下的項目均匀排列。
space-around 每個項目周圍分配相同的空間。
space-evenly 每個項目之間的間隔相等。

 


 

align-items

接近垂直對齊的設定,但嚴格說來是稱為交錯軸對齊,主軸的設定是上方的 flex-direction ,所以實際是水平或垂直,要依主軸的方向而定。

描述
flex-start 項目位於容器的開頭。
flex-end 項目位於容器的末端。
center 項目位於容器的中央。
stretch 默認。項目被拉伸以適合容器。
baseline 項目被定位到容器的基線。

 


 

align-content

align-items 的多行版本,排列方式也有多一些,但注意 stretch 在高度被限制的情況下不會正常伸展。

描述
flex-start 朝著彈性容器的開頭對齊。
flex-end 朝著彈性容器的結尾對齊。
center 朝著彈性容器的中央對齊。
stretch 默認值。行拉伸以佔據剩餘空間。
space-between 行均勻分佈在彈性容器中。
space-around 行均勻分佈在彈性容器中,兩端各佔一半。

 


 

內元件

flex ( flex-grow & flex-shrink & flex-basis )

flex 是縮寫,裡面依序包含三個屬性 flex-grow 、 flex-shrink 和 flex-basis ,如果只設定一個則是 flex-grow 。

flex-grow

元件的伸展性,是一個數值,當空間分配還有剩餘時的當前元件的伸展性,預設值為 0 ,如果設置為 0 則不會伸長。

HTML

<div class="flex">
    <div class="box box1"></div>
    <div class="box box2"></div>
    <div class="box box3"></div>
</div>

CSS

.container {width: 1000px;}
.flex {
    display: flex;
    background-color: #efefef;
}
.box {
    width: 100px;
    height: 100px;
}
.box1 {
    background-color: #eab7b7;
    flex-grow: 2;
}
.box2 {
    background-color: #99dcb5;
    flex-grow: 1;
}
.box3 {background-color: #99c0dc;}

若設定 container 寬度爲 1000px ,紅色、綠色、藍色方塊皆爲 100px ,剩餘區域爲 700px 。

將紅色盒子設定 flex-grow: 2; 接著將綠色盒子設定 flex-grow: 1; ,表示剩餘空間 700px,分爲 3 份,分配給紅色盒子 2 份及綠色盒子 1 份,效果如下:

若隨著寬度縮放,剩餘空間不同,則被分配到的寬度也會不一樣。

flex-shrink

元件的收縮性,是一個數值,當空間分配還不足時的當前元件的收縮性,預設值為 1 ,如果設置為 1 表示被壓縮的比例相同,設置為 0 則不會縮小。

container 寬度維持 1000px ,每個 box 寬度改爲 400px ,總共 1200px ,超出 container 寬度,但每個盒子因爲 flex-shrink 預設爲 1 的關係,不夠的空間會均分壓縮三個盒子。

.box {
    width: 400px;
    height: 100px;
}
.box1 {
    background-color: #eab7b7;
    flex-shrink: 0;
}
.box2 {
    background-color: #99dcb5;
    flex-shrink: 1;
}
.box3 {
    background-color: #99c0dc;
    flex-shrink: 0;
}

接著試試看綠色盒子 flex-shrink 爲 1 ,其他盒子爲 0 ,則不夠的部分只會壓縮綠色盒子,效果如下:

壓縮盒子的分配並不像多餘空間是以設定的比例直接分配,而是要考慮原來盒子的大小,當盒子大小不同時,能夠承受被壓縮的程度就會不同。

flex-basis

元件的基準值,可使用不同的單位值,預設值為 0 ,沒有設定此屬性的時候,會以直接採用 flex-grow 屬性, flex-basis 也可以設為 auto ,如果為 auto ,就表示子元素以自己的基本大小為單位。

.box {
    width: 200px;
    height: 100px;
}
.box1 {background-color: #eab7b7;}
.box2 {background-color: #99dcb5;}
.box3 {
    background-color: #99c0dc;
    flex-basis: 400px;
}

container 寬度維持 1000px ,每個 box 寬度改爲 200px 。將藍色盒子加上 flex-basis: 400px; ,則 flex-basis 會覆蓋 width ,效果如下:

 


 

align-self

可以調整內元件交錯軸的對齊設定( 主軸線則不能另外做設定 ),且可以個別設定單一元件的值。

align-self 的設定與 align-items 相同,但目的不同, align-self 的作用在於覆寫已經套用 align-items 的屬性。

描述
flex-start 元素位於容器的開頭。
flex-end 元素位於容器的末端。
center 元素位於容器的中央。
stretch 定位元素以適合容器。
baseline 元素被定位到容器的基線。

 


 

order

可以重新定義元件的排列順序,順序會依據數值的大小排列。

HTML

<div class="flex">
    <div class="box box1"></div>
    <div class="box box2"></div>
    <div class="box box3"></div>
    <div class="box box4"></div>
    <div class="box box5"></div>
    <div class="box box6"></div>
    <div class="box box7"></div>
</div>

CSS

.flex {
    display: flex;
    background-color: #efefef;
}
.box {
    width: 100px;
    height: 100px;
}
.box1 {background-color: #eab7b7;}
.box2 {background-color: #99dcb5;}
.box3 {background-color: #99c0dc;}
.box4 {background-color: #d6b7e0;}
.box5 {background-color: #dae0b7;}
.box6 {background-color: #d2c1a1;}
.box7 {background-color: #d2a1c0;}

若想把上面改成彩虹色譜的順序,添加 order 就不需要更動 HTML 碼了。

.box1 {
    background-color: #eab7b7;
    order: 1;
}
.box2 {
    background-color: #99dcb5;
    order: 4;
}
.box3 {
    background-color: #99c0dc;
    order: 5;
}
.box4 {
    background-color: #d6b7e0;
    order: 7;
}
.box5 {
    background-color: #dae0b7;
    order: 3;
}
.box6 {
    background-color: #d2c1a1;
    order: 2;
}
.box7 {
    background-color: #d2a1c0;
    order: 6;
}

 


 

參考資料

  1. CSS彈性盒子用法
  2. 圖解:CSS Flex 屬性一點也不難
  3. 深入解析 CSS Flexbox
  4. CSS flex-direction 属性
  5. CSS flex-wrap 属性
  6. CSS justify-content 属性
  7. justify-content - CSS(层叠样式表) | MDN
  8. CSS align-items 属性
  9. CSS align-content 属性
  10. Day24 Flex 空間分配 flex-grow / flex-shrink / flex-basis

#css #css保健室 #flex #display #flex-flow #flex-direction #flex-wrap #justify-content #align-items #flex-grow #flex-shrink #flex-basis #align-self #order







Related Posts

效能

效能

.Net MVC authorization Controller and Workcontext extension in razor view

.Net MVC authorization Controller and Workcontext extension in razor view

JS30 Day 25 筆記

JS30 Day 25 筆記


Comments